import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import { resolve } from "path";
import Components from "unplugin-vue-components/vite";
import { ElementPlusResolver } from "unplugin-vue-components/resolvers";
import Icons from "unplugin-icons/vite";
import IconsResolver from "unplugin-icons/resolver";
import AutoImport from "unplugin-auto-import/vite";

export default defineConfig({
  plugins: [
    vue(),
    AutoImport({
      // 自动导入 Vue 相关函数，如：ref, reactive, toRef 等
      imports: ["vue"],
      // 自动导入 Element Plus 相关函数，如：ElMessage, ElMessageBox... (带样式)
      resolvers: [ElementPlusResolver()],
      dts: "src/auto-imports.d.ts",
      // 确保生成的声明文件生效
      vueTemplate: true,
      // 确保自动导入在所有文件中都生效
      include: [
        /\.[tj]sx?$/, // .ts, .tsx, .js, .jsx
        /\.vue$/, /\.vue\?vue/, // .vue
        /\.md$/, // .md
      ],
      // 生成全局导入
      eslintrc: {
        enabled: true, // 自动生成eslint配置
        filepath: './.eslintrc-auto-import.json',
        globalsPropValue: true,
      },
    }),
    Components({
      // 自动导入组件的目录
      dirs: ["src/components"],
      // 自定义组件的解析器
      resolvers: [
        // 自动导入 Element Plus 组件
        ElementPlusResolver(),
        // 自动导入图标组件
        IconsResolver({
          enabledCollections: ["ep"], // element-plus 图标
        }),
      ],
      // 组件的有效文件扩展名
      extensions: ["vue", "jsx", "tsx"],
      // 生成类型声明文件
      dts: "src/components.d.ts",
      // 是否搜索子目录
      deep: true,
      // 允许导入的自定义组件前缀
      include: [/\.vue$/, /\.vue\?vue/],
    }),
    Icons({
      autoInstall: true,
    }),
  ],
  resolve: {
    alias: {
      "@": resolve(__dirname, "src"),
    },
  },
  server: {
    port: 3000,
    open: true,
    host: '0.0.0.0',
    // 配置代理
    proxy: {
      // 代理所有以 /api 开头的请求
      '/api': {
        target: 'http://149.88.80.204:8000', // 后端服务器地址
        changeOrigin: true, // 允许跨域
        // 重写路径，保留完整的后端路径
        rewrite: (path, req) => {
          // 获取原始请求路径
          // const originalPath = req.url;
          // 重写后的路径（保留 /api 前缀，因为后端需要完整的路径）
          const rewrittenPath = path; // 不修改路径，直接转发
          
          // 构建完整的目标URL
          const targetUrl = `http://149.88.80.204:8000${rewrittenPath}`;
          
          // 输出详细的请求信息
          console.log('🔄 代理请求重写信息:');
          // console.log(`  原始请求: ${req.method} ${originalPath}`);
          console.log(`  重写前路径: ${path}`);
          console.log(`  重写后路径: ${rewrittenPath}`);
          console.log(`  目标完整URL: ${targetUrl}`);
          console.log(`  请求时间: ${new Date().toLocaleString()}`);
          console.log('─'.repeat(50));
          
          return rewrittenPath;
        },
        // 增强的代理配置
        configure: (proxy, options) => {
          // 代理错误处理
          proxy.on('error', (err, req, res) => {
            console.error('❌ 代理错误:', {
              error: err.message,
              originalUrl: req.url,
              method: req.method,
              timestamp: new Date().toLocaleString()
            });
          });
          
          // 代理请求发送前
          proxy.on('proxyReq', (proxyReq, req, res) => {
            console.log('📤 发送请求到目标服务器:', {
              method: req.method,
              originalUrl: req.url,
              targetUrl: `${options.target}${req.url.replace(/^\/api/, '')}`,
              headers: req.headers,
              timestamp: new Date().toLocaleString()
            });
          });
          
          // 代理响应接收后
          proxy.on('proxyRes', (proxyRes, req, res) => {
            console.log('📥 收到目标服务器响应:', {
              statusCode: proxyRes.statusCode,
              originalUrl: req.url,
              responseTime: new Date().toLocaleString(),
              contentLength: proxyRes.headers['content-length'] || 'unknown'
            });
          });
        }
      }
      // 如果需要代理其他路径，可以继续添加
      // '/upload': {
      //   target: 'http://149.88.80.204:8000',
      //   changeOrigin: true,
      //   rewrite: (path) => path.replace(/^\/upload/, '/upload')
      // }
    }
  }
}) 
